
package redeS.mensagem.requisicao;

import redeS.mensagem.*;
import redeS.visualizacao.P2PObserver;
import redeS.visualizacao.P2PObserverConstants;

/**
 * Classe que representa uma requisição de um Query.
 * @see Request
 * @author thiago-pc
 */
public class QueryRequest extends Request {
	
	private int firewalledAnswers;
	private boolean observerClass; //<<-- Classe Observadora
	
	public QueryRequest(Query query){
		super(query);
		firewalledAnswers = 0;
		observerClass = true; //<<-- Classe Observadora
	}

	/**
	 * Número de nós que responderam afirmativamente mas estão atrás de um firewall.
	 */
	public int getFirewalledAnswers() {
		return firewalledAnswers;
	}
	
	/**
	 * Método sobrecarregado. Veja {@link Request#isAnswer(GnutellaMessage)}.</br>
	 * Em caso afirmativo incrementa o valor da variável que acumula o número de
	 * nós que responderam a esse Query mas estão atrás de um firewall.
	 * Obtenha esse valor com {@link #getFirewalledAnswers()}, e incrementa o valor do
	 * número de respostas que essa requisição obteve. Obtenha esse valor em:
	 * {@link Request#getNumberOfAnswers()}
	 */
	@Override
	public boolean isAnswer(GnutellaMessage message) {
		// se o queryhit tiver o mesmo ID do query dessa requisição
		if(message instanceof QueryHit && ID == message.getDescriptorID()){
			numberOfAnswers++;
			firewalledAnswers++;
			
			// /*******************/ Classe observadora /*******************/
			if(observerClass){
				P2PObserver.setData(P2PObserverConstants.SEARCHTIME,
						(float)hops, null);
				observerClass = false;
			}
			// /************************************************************/
			return true;
		}
		return false;
	}
}
